home *** CD-ROM | disk | FTP | other *** search
- {
- WILLIAM SITCH
-
- > Okay, I've just finally got my hands on the formulas for
- > doing good Graphics manipulations...well, I decided to start
- > With something simple. A rotating square. But it DOESN'T
- > WORK RIGHT. I noticed the size seemed to shift in and out
- > and a little testing showed me that instead of following a
- > circular path (as they SHOULD), the corners (while spinning)
- > actually trace out an OCTAGON. Why???? I've checked and
- > rechecked the formula logic...It's just as I was given. So
- > there's some quirk about the code that I don't know about.
- > Here's the rotating routine:
-
- Ahhh... "rounding errors" is what my comp sci teacher explained to me, but
- there isn't much you can do about it... I've included my (rather long)
- spinning disc code to take a look at ... feel free to try to port it to your
- application...
-
- }
-
- Uses
- Graph, Crt;
-
- Procedure spin_disk;
- Type
- pointdataType = Array [1..4] of Record x,y : Integer; end;
- Const
- delVar = 10;
-
- Var
- ch : Char;
- p, op : pointdataType;
- cx, cy,
- x, y, r : Integer;
- i : Integer;
- rot : Integer;
- tempx,
- tempy : Integer;
- theta : Real;
- down : Boolean;
- del : Real;
- begin
- cx := getmaxx div 2;
- cy := getmaxy div 2;
- r := 150;
- circle(cx,cy,r);
-
- rot := 0;
- p[1].x := 100; p[1].y := 0;
- p[2].x := 0; p[2].y := -100;
- p[3].x := -100; p[3].y := 0;
- p[4].x := 0; p[4].y := 100;
- del := 50;
- down := True;
-
- Repeat
- rot := rot + 2;
- theta := rot * 3.14 / 180;
- For i := 1 to 4 do
- begin
- tempx := p[i].x;
- tempy := p[i].y;
- op[i].x := p[i].x;
- op[i].y := p[i].y;
- p[i].x := round(cos(theta) * tempx - sin(theta) * tempy);
- p[i].y := round(sin(theta) * tempx + cos(theta) * tempy);
- end;
- setcolor(0);
- line(op[1].x + cx,cy - op[1].y,op[2].x + cx,cy - op[2].y);
- line(op[2].x + cx,cy - op[2].y,op[3].x + cx,cy - op[3].y);
- line(op[3].x + cx,cy - op[3].y,op[4].x + cx,cy - op[4].y);
- line(op[4].x + cx,cy - op[4].y,op[1].x + cx,cy - op[1].y);
- For i := 1 to 4 do
- line(op[i].x + cx,cy - op[i].y,cx,cy);
- setcolor(11);
- line(p[1].x + cx,cy - p[1].y,p[2].x + cx,cy - p[2].y);
- line(p[2].x + cx,cy - p[2].y,p[3].x + cx,cy - p[3].y);
- line(p[3].x + cx,cy - p[3].y,p[4].x + cx,cy - p[4].y);
- line(p[4].x + cx,cy - p[4].y,p[1].x + cx,cy - p[1].y);
- setcolor(10);
- For i := 1 to 4 do
- line(p[i].x + cx,cy - p[i].y,cx,cy);
- if (del < 1) then
- down := False
- else if (del > 50) then
- down := True;
- if (down) then
- del := del - delVar
- else
- del := del + delVar;
- Delay(round(del));
- Until (KeyPressed = True);
- ch := ReadKey;
- NoSound;
- end;
-
- Var
- Gd, Gm : Integer;
-
- begin
- Gd := Detect;
- InitGraph(Gd, Gm, 'd:\bp\bgi');
-
- Spin_disk;
-
- end.